package org.dromara.common.redis.handler;

import org.dromara.common.core.utils.StringUtils;
import org.redisson.api.NameMapper;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：redis缓存key前缀处理
 */
/**
 * KeyPrefixHandler类通过实现NameMapper接口，提供了对键名添加前缀的处理功能
 * 它的主要作用是在键名映射时，给每一个键名添加指定的前缀，以实现命名的规范化或模块化
 */
public class KeyPrefixHandler implements NameMapper {

    /**
     * 声明一个不可变的字符串变量用于存储键前缀
     */
    private final String keyPrefix;

    /**
     * 构造函数，用于初始化键前缀处理器
     * @param keyPrefix 传入的键前缀字符串
     */
    public KeyPrefixHandler(String keyPrefix) {
        // 前缀为空 则返回空前缀
        // 如果前缀为空或仅包含空白字符，则设置keyPrefix为空字符串，否则设置为传入的前缀加上冒号
        this.keyPrefix = StringUtils.isBlank(keyPrefix) ? "" : keyPrefix + ":";
    }

    /**
     * 增加前缀
     * 将名称映射到带前缀的键
     * 如果名称为空或空白，则返回null
     * 如果指定了前缀且名称不以该前缀开始，则将前缀添加到名称前
     *
     * @param name 要映射的名称
     * @return 映射后的带前缀的键，如果输入为空或空白则为null
     */
    @Override
    public String map(String name) {
        if (StringUtils.isBlank(name)) {
            return null;
        }
        // 检查是否指定了前缀且名称不以该前缀开始
        if (StringUtils.isNotBlank(keyPrefix) && !name.startsWith(keyPrefix)) {
            return keyPrefix + name;
        }
        return name;
    }

    /**
     * 去除前缀
     * 如果名称为空或空白，则返回null
     * 如果指定了前缀且名称以前缀开始，则去除前缀并返回剩余部分
     *
     * @param name 带前缀的键
     * @return 去除前缀后的名称，如果输入为空或空白则为null
     */
    @Override
    public String unmap(String name) {
        if (StringUtils.isBlank(name)) {
            return null;
        }
        // 检查是否指定了前缀且名称以前缀开始
        if (StringUtils.isNotBlank(keyPrefix) && name.startsWith(keyPrefix)) {
            return name.substring(keyPrefix.length());
        }
        return name;
    }

}
